﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using Newtonsoft.Json;

namespace MemoryDuosControl
{
    public class AccesoGaleria
    {
        public AccesoGaleria()
        {
        }

        public void GuardarAFichero()
        {
        }

        public static void Subir(String nombreGalería, String ruta)
        {
            string address = Conexion.UrlPruebas + String.Format("galerias.php?nombre={0}", nombreGalería);
            byte[] text;
            string devuelto;
            using (var cliente = new CookieAwareWebClient())
            {
                text = cliente.UploadFile(address, ruta);
                devuelto = System.Text.Encoding.Default.GetString(text);
            }
            var estado = JsonConvert.DeserializeObject<EstadoPeticion>(devuelto);
            if (estado.Estado == false)
            {
                throw new Exception("Error al  subir alguna de las imagenes");
            }
        }

        public static Image LeerDeServidor(Galería gal)
        {
            string address = String.Format(Conexion.UrlPruebas + "galerias.php?nombre={0}&id={1}", gal.Nombre, gal.Codigo);
            byte[] text;

            using (var cliente = new CookieAwareWebClient())
            {
                text = cliente.DownloadData(address);
                var str = System.Text.Encoding.Default.GetString(text);
            }
            if (text.Length > 20)
                return byteArrayToImage(text);
            return null;
        }

        private static Image byteArrayToImage(byte[] byteArrayIn)
        {
            MemoryStream ms = new MemoryStream(byteArrayIn);
            Image returnImage = Image.FromStream(ms);
            return returnImage;
        }

        public void LeerDeLocal()
        {
        }

        public static List<Image> ObtenerImagenes(string galería)
        {
            var listacod = LeerGalerías(galería);

            List<Image> devolver = new List<Image>();
            foreach (var item in listacod)
            {
                Image gal = AccesoGaleria.LeerDeServidor(item);
                devolver.Add(gal);
            }
            return devolver;
        }

        public static List<int> ObtenerCodigosImagenes(string galería)
        {
            var lista = LeerGalerías();
            var lista2 = from elemento in lista
                         where elemento.Nombre == galería
                         select elemento.Codigo;

            return lista2.ToList();
        }

        public static List<Galería> LeerGalerías()
        {
            string address = Conexion.UrlPruebas + "galerias.php";
            string text;
            using (var cliente = new CookieAwareWebClient())
            {
                text = cliente.DownloadString(address);
            }

            try
            {
                return JsonConvert.DeserializeObject<List<Galería>>(text);
            }
            catch (JsonSerializationException exc)
            {
                throw new Exception("Hubo un error al procesar la información de las galerías. El servidor retornó: " + text, exc);
            }
        }

        public static List<Galería> LeerGalerías(string nombre)
        {
            string address = String.Format(Conexion.UrlPruebas + "galerias.php?nombre={0}", nombre);
            string text;
            using (var cliente = new CookieAwareWebClient())
            {
                text = cliente.DownloadString(address);
            }
            return JsonConvert.DeserializeObject<List<Galería>>(text);
        }

        public static EstadoPeticion EliminarGalería(string nombre)
        {
            string address = String.Format(Conexion.UrlPruebas + "galerias.php?eliminar={0}", nombre);
            string text;
            using (var cliente = new CookieAwareWebClient())
            {
                text = cliente.DownloadString(address);
            } try
            {
                return JsonConvert.DeserializeObject<EstadoPeticion>(text);
            }
            catch (JsonSerializationException exc)
            {
                throw new Exception("Hubo un error al procesar la peticion de borrado del servidor. El servidor respondió: " + text, exc);
            }
        }

        public static bool ExisteGalería(string Nombre)
        {
            var lista = AccesoGaleria.LeerGalerías();
            var listaConNombre = lista.Find(p => p.Nombre.Equals(Nombre));
            return listaConNombre != null;
        }
    }

    public class Galería
    {
        public int Codigo { get; set; }

        public string Nombre { get; set; }
    }
}
